package br.edu.utfpr.backuptools.BackupTools.model.dao.interfaces;

import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

/**
 * Interface a ser extendida pelos DAOs especificos de cada bean.
 * 
 * @param <T extends IBean<?> O Bean/Pojo a ser persistido pela implementação deste DAO.
 */
public interface Dao<T>
{
	void save(T t);
	
	void delete(T t);
	
	T load(Long id);
	
	List<T> list();
	
	/**
	 * Busca um pouco mais específica para quando for necessário criar alias
	 * @param restricoes criterios para a busca
	 * @param alias CHAVE = nome do atributo no bean atividade - VALOR = nome que vai ser dado ao alias
	 * @return list de <T> encontrados com base nos filtros passados
	 */
	List<T> busca(List<Criterion> restricoes, Map<String, String> alias);
	
	/**
	 * Busca um pouco mais específica para quando for necessário criar alias
	 * @param restricoes criterios para a busca
	 * @param alias CHAVE = nome do atributo no bean atividade - VALOR = nome que vai ser dado ao alias
	 * @param order campo ao que vai ser ordenado o resultado
	 * @return list de <T> encontrados com base nos filtros passados
	 */
	List<T> busca(List<Criterion> restricoes, Map<String, String> alias, Order order);
	
	/**
	 * Sobrecarga do metodo busca, passando também o campo Limit Para 
	 * limitar o numero de resultados.
	 * @param restricoes
	 * @param order
	 * @param limit
	 * @return
	 */
	public List<T> busca(List<Criterion> restricoes, Order order, int limit);
	
	/**
	 * Faz uma busca com as restrições e ordena o resultado 
	 * 
	 * @param restricoes criterios para a busca
	 * @param order campo ao que vai ser ordenado o resultado
	 * @return
	 */
	public List<T> busca(List<Criterion> restricoes, Order order);
	
	/**
	 * Faz uma busca com as restrições sem ordenação
	 * 
	  * @param order campo ao que vai ser ordenado o resultado
	 * @return List<T> resultados encontrados
	 */
	public List<T> busca(List<Criterion> restricoes);
	
	/**
	 * Retorna todos os registros de ordenados 
	 * 
	  * @param order campo ao que vai ser ordenado o resultado
	 * @return List<T> resultados encontrados
	 */
	public List<T> busca(Order order);
	
	/**
	 * Retorna todos os registros sem ordenação
	 * 
	 * @return List<T> resultados encontrados
	 */
	public List<T> busca();

}

